package singleton;

//一般推荐5,6,7的写法
public class Setup {
	public static void main(String[] args) {
		//lazy 线程不安全
		Singleton1 singleton1 = Singleton1.getInstance();
		
		//lazy 线程安全（一般不怎么写）
		Singleton2 singleton2 = Singleton2.getInstance();
		
		//基于classloder机制避免了多线程的同步问题，所以线程安全,类装载时就实例化,但不能保证lazy效果。因为不知道类何时被加载
		Singleton3 singleton3 = Singleton3.getInstance();
		
		//适合有多个需要静态初始化的情况，其实和Singleton3没有本质区别
		Singleton4 singleton4 = Singleton4.getInstance();
		
		//基于classloder机制避免了多线程的同步问题,同时，只有显示通过调用getInstance方法时，
		//才会显示装载SingletonHolder类，从而实例化instance。适合大对象在调用时初始化
		Singleton5 singleton5 = Singleton5.getInstance();
		
		//使用枚举除了线程安全和防止反射强行调用构造器之外，还提供了自动序列化机制，
		//防止反序列化的时候创建新的对象。因此，Effective Java推荐尽可能地使用枚举来实现单例
		Singleton6 singleton6 = Singleton6.INSTANCE;
		
		//双层锁定
		Singleton7 singleton7 = Singleton7.getInstance();
	}
}
